package de.tudarmstadt.gdi1.project.cipher.substitution;

/* Aufgabe 11.1
 * Rotor stellt eine Walze der Enigma dar;
 * @ author Sabrina Diehl;
 */

import java.util.LinkedList;

public class Rotor implements de.tudarmstadt.gdi1.project.cipher.enigma.Rotor{
	int k = 0; // k ist die Ausgangstellung
	int t = k;
	
/* translate uebersetzt in den Geheimtext
 * @param c ist der zu verschluesselde Buchstabe
 * @param forward gibt an ob die Reservewalze schon durchlaufen wurde(false) oder noch nicht(true)
 * @return gibt den Buchstaben in verschluesselter Form wieder
 */

	@Override
	public char translate(char c, boolean forward) {
		int Index = 0;
		LinkedList<Integer> i = new LinkedList<Integer>();
		i.add(6);
		i.add(14);
		i.add(12); 
		i.add(26);
		i.add(17);
		i.add(1);
		i.add(11);
		i.add(24);
		i.add(13);
		i.add(25);
		i.add(20);
		i.add(2);
		i.add(7);
		i.add(8);
		i.add(21);
		i.add(19);
		i.add(4);
		i.add(23);
		i.add(10);
		i.add(16);
		i.add(3);
		i.add(9);
		i.add(18);
		i.add(22);
		i.add(15);
		i.add(5);
		if (c == 'A'){//erstes if legt den Index fest
			if (t > 25){
				t = t - 26;
				Index = i.get(t);
			}
			Index = i.get(t);
		}
		if (c == 'B'){
			if( t+1 > 25){
				t = (t+1) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+1);
		}
		if (c == 'C'){
			if ( t+2 > 25){
				t = (t+2) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+2);
		}
		if (c == 'D'){
			if ( t+3 > 25){
				t = (t+3) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+3);
		}
		if (c == 'E'){
			if (t+4 > 25){
				t = (t+4) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+4);
		}
		if (c == 'F'){
			if (t+5 > 25){
				t = (t+5) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+5);
		}
		if (c == 'G'){
			if (t+6 > 25){
				t = (t+6) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+6);
		}
		if (c == 'H'){
			if (t+7 > 25){
				t = (t+7) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+7);
		}
		if (c == 'I'){
			if (t+8 > 25){
				t = (t+8) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+8);
		}
		if (c == 'J'){
			if (t+9 > 25){
				t = (t+9) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+9);
		}
		if (c == 'K'){
			if (t+10 > 25){
				t = (t+10) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+10);
		}
		if (c == 'L'){
			if (t+11 > 25){
				t = (t+11) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+11);
		}
		if (c == 'M'){
			if (t+12 > 25){
				t = (t+12) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+12);
		}
		if (c == 'N'){
			if (t+13 > 25){
				t = (t+13) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+13);
		}
		if (c == 'O'){
			if (t+14 > 25){
				t = (t+14) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+14);
		}
		if (c == 'P'){
			if (t+15 > 25){
				t = (t+15) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+15);
		}
		if (c == 'Q'){
			if (t+16 > 25){
				t = (t+16) - 26;
				Index  = i.get(t);
			}
		    Index = i.get(t+16);
		}
		if (c == 'R'){
			if (t+17 > 25){
				t = (t+17) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+17);
		}
		if (c == 'S'){
			if (t+18 > 25){
				t = (t+18) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+18);
		}
		if (c == 'T'){
			if (t+19 > 25){
				t = (t+19) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+19);
		}
		if (c == 'U'){
			if (t+20 > 25){
				t = (t+20) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+20);
		}
		if (c == 'V'){
			if (t+21 > 25){
				t = (t+21) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+21);
		}
		if (c == 'W'){
			if (t+22 > 25){
				t = (t+22) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+22);
		}
		if (c == 'X'){
			if (t+23 > 25){
				t = (t+23) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+23);
		}
		if (c == 'Y'){
			if (t+24 > 25){
				t = (t+24) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+24);
		}
		if (c == 'Z'){
			if (t+25 > 25){
				t = (t+25) - 26;
				Index = i.get(t);
			}
			Index = i.get(t+25);
		}
		forward = false;
		
		 if(Index == 1){//zweites if uebersetzt in einen Buchstaben
			c = 'A';
		}if (Index == 2){
			c = 'B';
		}if (Index == 3){
			c = 'C';
		}if (Index == 4){
			c = 'D';
		}if (Index == 5){
		    c = 'E';
		}if (Index == 6){   		
		    c = 'F';
		}if (Index == 7){   		
		    c = 'G';
		}if (Index == 8){   		
		    c = 'H';    
		}if (Index == 9){   		
		    c = 'I';
		}if (Index == 10){   		
		    c = 'J';    
		}if (Index == 11){   		
		    c = 'K';
		}if (Index == 12){   		
		    c = 'L';
		}if (Index == 13){   		
		    c = 'M';
		}if (Index == 14){   		
		    c = 'N';
		}if (Index == 15){   		
		    c = 'O';
		}if (Index == 16){   		
		    c = 'P';
		}if (Index == 17){   		
		    c = 'Q';
		}if (Index == 18){   		
		    c = 'R';
		}if (Index == 19){   		
		    c = 'S';
		}if (Index == 20){   		
		    c = 'T';
		}if (Index == 21){   		
		    c = 'U';
		}if (Index == 22){   		
		    c = 'V';
		}if (Index == 23){   		
		    c = 'W';
		}if (Index == 24){   		
		    c = 'X';
		}if (Index == 25){   		
		    c = 'Y';
		}if (Index == 26){   		
		    c = 'Z';
		}c ='#';
		
		return c;
		
	}
	
	/* rotate ist fuer das drehen der Walze zustaendig;
	 * @return true wenn die Walze ihre Ausgangstellung erreicht hat und false wenn nicht;
	 */

	@Override
	public boolean rotate() {//dreht die Walze um eins weiter
		t = t+1;
		if ((t == k) || (t == k+26)){//wenn die Walze wieder in Ausgangsposition ist, dann wird die naechste Walze gedreht
			return true;
		}
		return false;
	}
	
	/* reset setzt die Walze wieder auf die Anfangspostion;
	 */

	@Override
	public void reset() {//die Walze wird auf die Anfangsposition k gedreht;
		t = k;
	}

}
